--dml触发器之 语句级触发器
--      语句级触发器  一个dml的sql语句只触发一次触发器
--      语句级触发有三个boolean变量：updating inserting deleting
--格式：
--  create or replace trigger  触发器名称
--  before|after   update  or insert or delete  of 某列
--  on  表名
--  begin
--       代码
--  end;

-- 创建一个触发器，打印对 student 表的所有操作
create or replace trigger t_1
    before update or insert or delete
    on STUDENT
begin
    -- 在对表 up ins del 执行前执行的代码
    if updating then
        DBMS_OUTPUT.PUT_LINE(systimestamp || ' 对 student表，进行了 更新');
    end if;
    if inserting then
        DBMS_OUTPUT.PUT_LINE(systimestamp || ' 对 student表，进行了 插入');
    end if;
    if deleting then
        DBMS_OUTPUT.PUT_LINE(systimestamp || ' 对 student表，进行了更新 删除');
    end if;
end;
-- 执行 dml 语句，测试触发器是否执行
insert into STUDENT (SID, SAG, SNAME, SEX)
values (1, 20, '杨磊', '男');

delete
from STUDENT
where SID = 1;

update STUDENT
set SEX='妖'
where SNAME = '杨磊';



-- new 
-- lod


--dml触发器之行级触发器（:old 和 :new 获取以前和新的数据）
--每行都触发一次触发器
--格式：
--  create or replace trigger  触发器名称
--  before|after   update  or insert or delete  of 某列
--  on  表名  for each row
--  begin
--       代码
--  end;
--:new 记录的是本行在进行dml之后的数据
--:old 记录的是本行在进行dml之前的数据
--update有:old和:new
--delete有:old
--insert有:new
--eg:把对student表的所有操作进行记录：
-- 创建一个 student_log 表
drop table student_log;
create table student_log
(

    -- 记录自己的id
    slog      int primary key,
    --  
    sid       int,
    sname_new varchar(100), --
    sname_old varchar(100),
    sex_new   varchar(3),
    sex_old   varchar(3),
    sage_new  int,
    sag_old   int,
    smessage  varchar(200)
);
create sequence sl_1 start with 10000;


-- 第二步：创建一个触发器 把对student表的所有dml信息写入student_log中
create or replace trigger t_1
    after update or insert or delete
    on STUDENT
    for each row
DECLARE
    updating int ;
begin
    if updating then
        DBMS_OUTPUT.PUT_LINE(systimestamp || ' 对 student 进行了 数据更新！！');
        insert into student_log (slog, sid, sname_new, sname_old, sex_new, sex_old, sage_new, sag_old, smessage)
        values (sl_1.nextval,
                :old.sid,
                :new.sname,
                :old.sname,
                :new.sex,
                :old.sex,
                :new.sag,
                :old.sag,
                '对' || :old.sid || '进行了 数据更新！！'
                );
    end if;

    if deleting then
        DBMS_OUTPUT.PUT_LINE(systimestamp || ' 对 student 进行了 删除！！');
        insert into student_log (slog, sid, sname_old, sex_old, sag_old, smessage)
        values (sl_1.nextval,
                :old.sid,
                :old.sname,
                :old.sex,
                :old.sag,
                '对' || :old.sid || '进行了 数据删除！！');
    end if;

    if inserting then
        DBMS_OUTPUT.PUT_LINE(systimestamp || ' 对 student 进行了 数据插入！！');
        insert into student_log (slog, sid, sname_new, sex_new, sage_new, smessage)
        values (sl_1.nextval,
                :new.sid,
                :new.sname,
                :new.sex,
                :new.sag,
                '添加' || :new.sid || '成功！！');
    end if;
end;

--第三步：执行dml语句 查询student_log表的结果
insert into STUDENT (SID, SAG, SNAME, SEX)
values (1, 22, '小王', '女');

update STUDENT
set sag = 2
where sid = 1
  and SNAME = '小王';

delete STUDENT
where SNAME = '小王';



--  对表结构进行增删改添加的触发器：create drop alter
--
--  参考：https://blog.csdn.net/lianjiww/article/details/81571763

-- ddl 触发器
--定义一个表记录 执行create的记录信息
create table created_log
(
    -- 所有者
    obj_owner    varchar2(30),
    -- 对象名称
    obj_name     varchar2(30),
    -- 对象类型
    obj_type     varchar2(30),
    -- 创建用户
    obj_user     varchar2(30),
    -- 创建日期
    created_date date
);

-- 定义触发器 当前用户创建数据库对象时触发
create trigger t_2
    after create
    on SCHEMA
begin
    insert into created_log (obj_owner, obj_name, obj_type, obj_user, created_date)
    values (SYS.DICTIONARY_OBJ_OWNER(),
            SYS.DICTIONARY_OBJ_NAME(),
            SYS.DICTIONARY_OBJ_TYPE(),
            SYS.LOGIN_USER(),
            SYSDATE);
end;

-- 测试
create table tab_1
(
    tid number
);
create view v_1 as
select *
from created_log;
create sequence SL_2;



-- 设置触发器无效
    alter trigger t_2 disable;
-- 设置触发器有效
    alter trigger t_2 enable;
-- 删除触发器
drop trigger t_2;


--  Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
select *
from v$version;